home *** CD-ROM | disk | FTP | other *** search
- /*
- * tree.c -- functions for constructing parse trees
- */
-
- #include "../h/config.h"
- #include "general.h"
- #include "tproto.h"
- #include "tree.h"
-
- /*
- * tree[1-6] construct parse tree nodes with specified values. tfree
- * points at the next free word in the parse tree space. Nodes are
- * built by copying argument values into successive locations starting
- * at tfree. Parameters a and b are line and column information,
- * while parameters c through f are values to be assigned to n_field[0-3].
- * Note that this could be done with a single routine; a separate routine
- * for each node size is used for speed and simplicity.
- */
-
- nodeptr tree1(type)
- int type;
- {
- register nodeptr t;
-
- t = tfree;
- tfree = (nodeptr) ((word *)tfree + 1);
- if (tfree > tend)
- tsyserr("out of tree space");
- t->n_type = type;
- return t;
- }
-
- nodeptr tree2(type, loc_model)
- int type;
- nodeptr loc_model;
- {
- register nodeptr t;
-
- t = tfree;
- tfree = (nodeptr) ((word *)tfree + 4);
- if (tfree > tend)
- tsyserr("out of tree space");
- t->n_type = type;
- t->n_file = loc_model->n_file;
- t->n_line = loc_model->n_line;
- t->n_col = loc_model->n_col;
- return t;
- }
-
- nodeptr tree3(type, loc_model, c)
- int type;
- nodeptr loc_model;
- nodeptr c;
- {
- register nodeptr t;
-
- t = tfree;
- tfree = (nodeptr) ((word *)tfree + 5);
- if (tfree > tend)
- tsyserr("out of tree space");
- t->n_type = type;
- t->n_file = loc_model->n_file;
- t->n_line = loc_model->n_line;
- t->n_col = loc_model->n_col;
- t->n_field[0].n_ptr = c;
- return t;
- }
-
- nodeptr tree4(type, loc_model, c, d)
- int type;
- nodeptr loc_model;
- nodeptr c, d;
- {
- register nodeptr t;
-
- t = tfree;
- tfree = (nodeptr) ((word *)tfree + 6);
- if (tfree > tend)
- tsyserr("out of tree space");
- t->n_type = type;
- t->n_file = loc_model->n_file;
- t->n_line = loc_model->n_line;
- t->n_col = loc_model->n_col;
- t->n_field[0].n_ptr = c;
- t->n_field[1].n_ptr = d;
- return t;
- }
-
- nodeptr tree5(type, loc_model, c, d, e)
- int type;
- nodeptr loc_model;
- nodeptr c, d, e;
- {
- register nodeptr t;
-
- t = tfree;
- tfree = (nodeptr) ((word *)tfree + 7);
- if (tfree > tend)
- tsyserr("out of tree space");
- t->n_type = type;
- t->n_file = loc_model->n_file;
- t->n_line = loc_model->n_line;
- t->n_col = loc_model->n_col;
- t->n_field[0].n_ptr = c;
- t->n_field[1].n_ptr = d;
- t->n_field[2].n_ptr = e;
- return t;
- }
-
- nodeptr tree6(type, loc_model, c, d, e, f)
- int type;
- nodeptr loc_model;
- nodeptr c, d, e, f;
- {
- register nodeptr t;
-
- t = tfree;
- tfree = (nodeptr) ((word *)tfree + 8);
- if (tfree > tend)
- tsyserr("out of tree space");
- t->n_type = type;
- t->n_file = loc_model->n_file;
- t->n_line = loc_model->n_line;
- t->n_col = loc_model->n_col;
- t->n_field[0].n_ptr = c;
- t->n_field[1].n_ptr = d;
- t->n_field[2].n_ptr = e;
- t->n_field[3].n_ptr = f;
- return t;
- }
-
- nodeptr int_leaf(type, loc_model, c)
- int type;
- nodeptr loc_model;
- int c;
- {
- register nodeptr t;
-
- t = tfree;
- tfree = (nodeptr) ((word *)tfree + 5);
- if (tfree > tend)
- tsyserr("out of tree space");
- t->n_type = type;
- t->n_file = loc_model->n_file;
- t->n_line = loc_model->n_line;
- t->n_col = loc_model->n_col;
- t->n_field[0].n_val = c;
- return t;
- }
-
- nodeptr c_str_leaf(type, loc_model, c)
- int type;
- nodeptr loc_model;
- char *c;
- {
- register nodeptr t;
-
- t = tfree;
- tfree = (nodeptr) ((word *)tfree + 5);
- if (tfree > tend)
- tsyserr("out of tree space");
- t->n_type = type;
- t->n_file = loc_model->n_file;
- t->n_line = loc_model->n_line;
- t->n_col = loc_model->n_col;
- t->n_field[0].n_str = c;
- return t;
- }
-
- nodeptr i_str_leaf(type, loc_model, c, d)
- int type;
- nodeptr loc_model;
- char *c;
- int d;
- {
- register nodeptr t;
-
- t = tfree;
- tfree = (nodeptr) ((word *)tfree + 6);
- if (tfree > tend)
- tsyserr("out of tree space");
- t->n_type = type;
- t->n_file = loc_model->n_file;
- t->n_line = loc_model->n_line;
- t->n_col = loc_model->n_col;
- t->n_field[0].n_str = c;
- t->n_field[1].n_val = d;
- return t;
- }
-
- /*
- * Clear the tree space by setting the free pointer back to the first word
- * of the tree space.
- */
-
- novalue treeinit()
- {
- tfree = tree;
- }
-